package com.lpwa.system.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import com.lpwa.common.annotation.DataScope;
import com.lpwa.common.utils.DateUtils;
import com.lpwa.common.utils.StringUtils;
import com.lpwa.system.domain.*;
import com.lpwa.system.mapper.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.lpwa.system.service.ILableService;
import com.lpwa.common.core.text.Convert;

/**
 * 标签 服务层实现
 * 
 * @author tanmu
 * @date 2019-06-03
 */
@Service
public class LableServiceImpl implements ILableService 
{
	@Autowired
	private PersonMapper personMapper;
	@Autowired
	private LableMapper lableMapper;
	@Autowired
	private LablePersonMapper lablePersonMapper;
	//数据库名称
	private static final String TABLE_SCHEMA = "tm";

	/**
     * 查询标签信息
     * 
     * @param lableId 标签ID
     * @return 标签信息
     */
    @Override
	public Tag selectLableById(String lableId)
	{
	    return lableMapper.selectLableById(lableId);
	}
	
	/**
     * 查询标签列表
     * 
     * @param lable 标签信息
     * @return 标签集合
     */
	@Override
	public List<Tag> selectLableList(Tag lable)
	{
		List<Tag> lableList = lableMapper.selectLableList(lable);
		for (Tag lab:lableList){
			if (StringUtils.isEmpty(lab.getPersonId())){
				String personId = selectbindPersionId(lab.getTagId());
				lab.setPersonId(personId);
			}
		}
	    return lableList;
	}
	
    /**
     * 新增标签
     * 
     * @param lable 标签信息
     * @return 结果
     */
	@Override
	public int insertLable(Tag lable)
	{
	    return lableMapper.insertLable(lable);
	}
	
	/**
     * 修改标签
     * 
     * @param lable 标签信息
     * @return 结果
     */
	@Override
	public int updateLable(Tag lable)
	{
	    return lableMapper.updateLable(lable);
	}

	/**
     * 删除标签对象
     * 
     * @param ids 需要删除的数据ID
     * @return 结果
     */
	@Override
	public int deleteLableByIds(String ids)
	{
		//删除标签同时解除标签和人员的关系，同时将人员绑定状态改为未绑定状态
		//通过标签Id集合查找绑定的人员Id集合
		List<String> personIdList = lablePersonMapper.selectLablePersonListByLableIds(Convert.toStrArray(ids));
		if (personIdList.size()>0){
			//解除人员绑定状态改为未绑定状态
			for(String personId : personIdList){
				Person person = new Person();
				person.setPersonId(personId);
				person.setIsBind(0);
				personMapper.updatePerson(person);
			}
			//更新关系表绑定状态
			lablePersonMapper.deleteLablePersonByLableId(Convert.toStrArray(ids));
		}
		//删除标签Id同时删除标签最新数据表中对应标签数据
//		tagLatestDataMapper.deleteTagLatestDataByIds(Convert.toStrArray(ids));
		return lableMapper.deleteLableByIds(Convert.toStrArray(ids));
	}
	/**
	 * 根据标签Id查询已绑定人员Id
	 *
	 * @String lableId 标签Id
	 * @return 结果
	 */
	public String selectbindPersionId(String lableId) {
		TagPerson lablePerson = new TagPerson();
		lablePerson.setTagId(lableId);
		lablePerson.setIsBind("1");
		//查询绑定标签Id
		List<TagPerson> lablePeopleList=lablePersonMapper.selectLablePersonList(lablePerson);
		if (lablePeopleList.size()>0){
			return lablePeopleList.get(0).getPersonId();
		}else {
			return null;
		}
	}
	@Override
	public String checkLableIdUnique(String lable) {
		int count = lableMapper.checkLableIdUnique(lable);
		if (count > 0)
		{
			return "1";
		}
		return "0";
	}

	/*
	*校验表是否存在，优先使用information_schema，如果没有权限则使用show tables检查
	* @String tableName
	* @return 结果true 存在 false不存在
	 */
	public boolean checkTableExists(String tableName) {
		try {
			Integer count = lableMapper.checkTableExistsWithSchema(TABLE_SCHEMA, tableName);
			return count == 1;
		} catch (Exception e) {
			Map<String, String> list = lableMapper.checkTableExistsWithShow(tableName);
			if(!StringUtils.isNull(list)) {
				return true;
			}
		}
		return false;
	}

	/*
	 *更新标签在线离线状态
	 * @String tableName
	 * @return 结果true 存在 false不存在
	 */
	@Override
	public void updateIsOnline(Integer s) {
		Tag tag = new Tag();
		tag.setIsOnline(1);
		//查询所有在线状态的标签
		List<Tag> lableList = lableMapper.selectLableList(tag);
		if (lableList.size()>0){
			 for (Tag t:lableList){
				 Date nowTime = DateUtils.getNowDate();
				 Date endTime = t.getUpdateTime();
				 long time = DateUtils.getDatePoorS(nowTime,endTime);
				 if (time>s){
				 	//当标签最新更新时间大于当前时间  多少秒时，更新标签的状态改为离线状态
					 tag.setIsOnline(0);
					 tag.setTagId(t.getTagId());
					 lableMapper.updateLable(tag);
				 }
			 }
		}
	}

	@Override
	public Person getPersonInfoByTagId(String tagId) {
		String personId = selectbindPersionId(tagId);
		if (StringUtils.isEmpty(personId)){
			return null;
		}else {
			Person person = personMapper.selectPersonById(personId);
			return person;
		}
	}
	/**
	 * 根据条件分页查询未分配用户角色列表
	 *
	 * @param tag 用户信息
	 * @return 用户信息集合信息
	 */
	@DataScope(tableAlias = "u")
	public List<Tag> selectUnallocatedList(Tag tag)
	{
		return lableMapper.selectUnallocatedList(tag);
	}

}
